﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SosData;
using SosForms;
using SosBL;

namespace UOCmaker
{
    public partial class FormPlantillaContenidoPreview : FormDetalle
    {

        #region " Contructores "

        /// <summary>
        /// Contructor
        /// </summary>
        public FormPlantillaContenidoPreview()
        {
            InitializeComponent();
            this.butRefrescar.Enabled = true;
            this.butCopiar.Enabled = true;
        }

        PlantillaContenido _plantillaContenido;
        sosContext db;

        /// <summary>
        /// Contructor
        /// </summary>
        public FormPlantillaContenidoPreview(PlantillaContenido plantillaContenido)
        {
            InitializeComponent();
            ModoForm = _modoForm.Navegacion;
            this.Text = plantillaContenido.Nombre;
            db = new sosContext();

            _plantillaContenido = (from pc in db.PlantillaContenidos where pc.Id == plantillaContenido.Id select pc).FirstOrDefault();

            bindingSource.DataSource = _plantillaContenido;

            this.reMarcarParametros();

        }

        /// <summary>
        /// Form Load
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void FormPlantillaContenidoPreview_Load(object sender, EventArgs e)
        {
            EstadoControlesForm(EstadoControles.Habilitar);
        }

        private void FormPlantillaContenidoPreview_Activated(object sender, EventArgs e)
        {
            reMarcarParametros();
        }

        #endregion

        #region " Controles "

        /// <summary>
        /// Refrescar output
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void butRefrescar_Click(object sender, EventArgs e)
        {
            SosBL.DataBL.ComprobarSiParametrosIncluidos(this.txtTextoParametrizado.Text, _plantillaContenido.Parametros.ToList());
            reMarcarParametros();
            FormSpeller chechSpellFrorm = null;

            switch (_plantillaContenido.Idioma)
            {
                case PlantillaContenido.Idiomas.En:
                    chechSpellFrorm = new FormSpeller(this.txtTextoParametrizado.Text, Utils.Language.English);
                    break;
                case PlantillaContenido.Idiomas.Cat:
                    chechSpellFrorm = new FormSpeller(this.txtTextoParametrizado.Text, Utils.Language.catalan);
                    break;
                case PlantillaContenido.Idiomas.Esp:
                    chechSpellFrorm = new FormSpeller(this.txtTextoParametrizado.Text, Utils.Language.español);
                    break;
            }

            chechSpellFrorm.ShowDialog();
            if (!chechSpellFrorm.cancelado)
            {
                this.txtTextoParametrizado.Text = chechSpellFrorm.textOut;
            }
        }

        /// <summary>
        /// Copiar texto en memoria
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void butCopiar_Click(object sender, EventArgs e)
        {
            ReemplazarParametros();
            SosBL.DataBL.ComprobarSiParametrosIncluidos(this.txtTextoParametrizado.Text, _plantillaContenido.Parametros.ToList());
            this.copiarTexto(this.txtTextoFinal.Text);

        }


        /// <summary>
        /// Ver UOCSais
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void butUOCsais_Click(object sender, EventArgs e)
        {
            this.verUOCsais();

        }


        #endregion

        #region " Metodos "

        /// <summary>
        /// Copiar texto en memoria
        /// </summary>
        private void copiarTexto(string text)
        {
            if (text != null && text != string.Empty)
            {
                Clipboard.SetText(text);
            }
        }

        /// <summary>
        /// reemplazar nombre del parametro por su valor.
        /// </summary>
        private void ReemplazarParametros()
        {
            this.txtTextoFinal.Text = SosBL.DataBL.GenerarPlantilla(this.txtTextoParametrizado.Text, _plantillaContenido.Parametros.ToList());

        }

        /// <summary>
        /// Insertar parametros en contextMenu
        /// </summary>
        private void cargarParametrosEnContextMenu()
        {
            contextMenuStripParametros.Items.Clear();

            foreach (PlantillaParametro parametro in _plantillaContenido.Parametros)
            {
                contextMenuStripParametros.Items.Add(parametro.Nombre);
            }

        }

        /// <summary>
        /// Añadir parametro en el texto 
        /// </summary>
        /// <param name="NombreParametro">Nombre del parametro</param>
        private void AñadirParametroEnTexto(string NombreParametro)
        {
            string textPartLeft = this.txtTextoParametrizado.Text.Substring(0, txtTextoParametrizado.SelectionStart);
            string textPartRight = this.txtTextoParametrizado.Text.Substring(textPartLeft.Length + txtTextoParametrizado.SelectedText.Length);

            string text = textPartLeft + NombreParametro + textPartRight;

            this.txtTextoParametrizado.Text = text;

        }


        /// <summary>
        /// remarcar con un color los parametros
        /// </summary>
        private void reMarcarParametros()
        {
            string originalText = txtTextoParametrizado.Text;
            txtTextoParametrizado.Text = "";
            txtTextoParametrizado.Text = originalText;

            Random colorRandom = new Random();

            foreach (PlantillaParametro parametro in _plantillaContenido.Parametros)
            {
                Color backColor = Color.FromArgb(colorRandom.Next(0, 255), colorRandom.Next(0, 255), colorRandom.Next(0, 255));

                int index = 0;

                while (index < this.txtTextoParametrizado.Text.LastIndexOf(parametro.Nombre))
                {
                    this.txtTextoParametrizado.Find(parametro.Nombre, index, this.txtTextoParametrizado.TextLength, RichTextBoxFinds.None);
                    this.txtTextoParametrizado.SelectionBackColor = backColor;
                    this.txtTextoParametrizado.SelectionColor = Utils.ContrastColor(backColor);
                    index = txtTextoParametrizado.Text.IndexOf(parametro.Nombre, index) + 1;
                }
            }
        }

        /// <summary>
        /// Ver uocSais
        /// </summary>
        private void verUOCsais()
        {
            FormUOCsais UOCsaisFrm = new FormUOCsais(_plantillaContenido.Plantillas);
            UOCsaisFrm.MdiParent = this.ParentForm;
            UOCsaisFrm.ModoForm = _modoForm.Navegacion;
            UOCsaisFrm.Show();
        }



        #endregion

        #region " ContextMenu "

        /// <summary>
        /// Cargar parametros en contextMenu
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void contextMenuStripParametros_Opening(object sender, CancelEventArgs e)
        {
            cargarParametrosEnContextMenu();
        }

        /// <summary>
        /// Añadir parametro en el texto
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void contextMenuStripParametros_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            AñadirParametroEnTexto(e.ClickedItem.Text);
        }
        #endregion

        #region " Metodos datos "

        public override void Guardar()
        {
            bindingSource.EndEdit();
            db.SaveChanges();
            this.Close();
        }

        public override void Cancelar()
        {
            this.Close();
        }
        #endregion

        #region " Eventos controles "

        /// <summary>
        /// Generar texto output
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void txtTextoParametrizado_TextChanged(object sender, EventArgs e)
        {
            this.ReemplazarParametros();
        }

        /// <summary>
        /// Generar texto output mientras se cambia el valor del parametro
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void txtValorParametro_TextChanged(object sender, EventArgs e)
        {
            this.ReemplazarParametros();
        }

        #endregion

        private void romButton1_Click(object sender, EventArgs e)
        {
            FormBuscarPlantilla b = new FormBuscarPlantilla(typeof(PlantillaContenido));
            b.ShowDialog();
        }

        private void ParametrosGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.ColumnIndex == 0)
                {
                    if (this.ParametrosGridView.CurrentCell.Value.ToString() == "?")
                    {
                        FormBuscarPlantilla buscar = new FormBuscarPlantilla();
                        buscar.ShowDialog();
                        var plantillaSeleccionada = (from p in db.PlantillaContenidos.Where(p => p.Id == buscar.idSeleccionado) select p).FirstOrDefault().Nombre;
                        this.ParametrosGridView.CurrentCell.Value = "#" + plantillaSeleccionada + "#";
                    }
                }
            }
            catch { }
        }



    }

}
